package com.wx.chapter14.list_;

/**
 * @Author : 佩萁
 * Description :
 * @Create : 2023/7/28 - 19:27
 */
public class LinkedList01 {
    public static void main(String[] args) {
        //创建三个存入双向链表的对象
        Node jack = new Node("jack");
        Node tom = new Node("tom");
        Node hsp = new Node("hsp");
        //连接三个对象形成双向链表 jack-->tom-->hsp
        jack.next = tom;
        tom.next = hsp;
        hsp.pre = tom;
        tom.pre = jack;
        Node first = jack;//让 first 引用指向jack,就是双向链表的头结点
        Node last = hsp;//让 last 引用指向 hsp,就是双向链表的尾结点
        System.out.println("========从头遍历到尾=========");
        while (true) {
            if (first == null) {//如果到了末尾，末尾的next是null就会停止循环跳出
                break;
            }//否则输出当前的对象
            System.out.println(first);
            first = first.next;//调到下一个对象
        }

        System.out.println("========从尾遍历到头=========");
        while (true) {
            if (last == null) {//如果到了末尾，末尾的next是null就会停止循环跳出
                break;
            }//否则输出当前的对象
            System.out.println(last);
            last = last.pre;//调到下一个对象
        }

        //链表对象的添加
        //要求，是在 tom ---------  老韩直接，插入一个对象 smith
        //先创建一个Node对象，等会儿存进去  jack  tom  smith  hsp
        Node smith = new Node("smith");
        smith.pre = tom;
        smith.next = hsp;
        hsp.pre = smith;
        tom.next = smith;
        //让first再次指向jack
        first = jack;
        System.out.println("========从头遍历到尾=========");
        while (true) {
            if (first == null) {//如果到了末尾，末尾的next是null就会停止循环跳出
                break;
            }//否则输出当前的对象
            System.out.println(first);
            first = first.next;//调到下一个对象
        }

        //让last再次指向hsp
        last = hsp;
        System.out.println("========从尾遍历到头=========");
        while (true) {
            if (last == null) {//如果到了末尾，末尾的next是null就会停止循环跳出
                break;
            }//否则输出当前的对象
            System.out.println(last);
            last = last.pre;//调到下一个对象
        }
    }
}

class Node {//定义一个Node类,Node对象表示双向链表的一个结点
    public Object item;//双向链表中存放数据
    public Node next;//指向后一个结点
    public Node pre;//指向前一个结点

    @Override
    public String toString() {
        return "Node name = " + item;

    }

    public Object getItem() {
        return item;
    }

    public void setItem(Object item) {
        this.item = item;
    }

    public Node getNext() {
        return next;
    }

    public void setNext(Node next) {
        this.next = next;
    }

    public Node getPre() {
        return pre;
    }

    public void setPre(Node pre) {
        this.pre = pre;
    }

    public Node(Object item) {
        this.item = item;
    }

    public Node(Object item, Node next, Node pre) {
        this.item = item;
        this.next = next;
        this.pre = pre;
    }
}